﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tanmia.Basis.Core;

namespace Tanmia.Basis.Domain
{
    public abstract class BaseDomainObject<T>
        where T : BaseBusinessObject
    {
        protected IRepository<T> repository = new Repository<T>();

        #region IRepository<T> Members

        /// <summary>
        /// يقوم هذا التابع بالحفظ على قاعدة البيانات
        /// </summary>
        /// <param name="entity">الكائن المراد حفظه على قاعدة البيانات</param>
        /// <returns>الكائن الذي تم حفظه</returns>
        public virtual T Save(T entity)
        {
            if (entity == null)
                throw new ArgumentNullException("Your input is incorrect!", new Exception("\"entity\" could not equals to null"));

            repository.Save(entity);
            return entity;
        }

        /// <summary>
        /// يقوم هذا التابع بالتعديل على قاعدة البيانات
        /// </summary>
        /// <param name="entity">الكائن المراد تعديله في قاعدة البيانات</param>
        /// <returns>الكائن الذي تم تعديله</returns>
        public virtual T Update(T entity)
        {
            if (entity == null)
                throw new ArgumentNullException("Your input is incorrect!", new Exception("\"entity\" could not equals to null"));

            repository.Update(entity);
            return entity;
        }

        /// <summary>
        /// يقوم هذا التابع بالتعديل على قاعدة البيانات
        /// </summary>
        /// <param name="entity">الكائن المراد تعديله في قاعدة البيانات</param>
        /// <returns>الكائن الذي تم تعديله</returns>
        public virtual T SaveOrUpdate(T entity)
        {
            if (entity == null)
                throw new ArgumentNullException("Your input is incorrect!", new Exception("\"entity\" could not equals to null"));

            repository.SaveOrUpdate(entity);
            return entity;
        }

        /// <summary>
        /// يقوم هذا التابع بالحذف من قاعدة البيانات
        /// </summary>
        /// <param name="entity">الكائن المراد حذفه</param>
        public virtual void Delete(T entity)
        {
            if (entity == null)
                throw new ArgumentNullException("Your input is incorrect!", new Exception("\"entity\" could not equals to null"));

            repository.Delete(entity);
        }

        /// <summary>
        /// هذا التابع يقوم بإحضار الكائن حسب رقمه التسلسلي
        /// </summary>
        /// <param name="entityID"> الرقم التسلسلي</param>
        /// <returns>الكائن المطلوب</returns>
        public virtual T Get(int entityID)
        {
            if (entityID == 0)
                throw new ArgumentNullException("Your input is incorrect!", new Exception("\"entity\" could not equals to zero"));

            return repository.Get(entityID);
        }

        /// <summary>
        /// هذا التابع يقوم بإحضار كل محتويات قاعدة البيانات
        /// </summary>
        /// <returns>قائمة بكافة محتويات قاعدة البيانات</returns>
        public virtual IList<T> Gets()
        {
            return repository.Gets();
        }

        /// <summary>
        /// هذا التابع يقوم بالبحث
        /// </summary>
        /// <param name="propertyValuepairs">معايير البحث</param>
        /// <returns>نتائج البحث</returns>
        public virtual IList<T> Search(Dictionary<string, object> propertyValuepairs)
        {
            if (propertyValuepairs.Count == 0)
                throw new ArgumentNullException("Your input is incorrect!", new Exception("There is no filters in <propertyValuepairs>"));

            return repository.Search(propertyValuepairs);
        }

        protected virtual IList<T> GetsWithSelect(IList<T> listItems, params T[] selectItem)
        {
            var reVal = listItems;

            foreach (T item in selectItem)
            {
                reVal.Insert(0, item);
            }

            return reVal;
        }

        #endregion
    }
}
